package com.java8.sgg.method;

import org.junit.Test;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.Comparator;


public class testMethodReference {

    //原始写法:使用匿名内部类
    @Test
    public void test() {
        Person[] pArrr = new Person[]{
                new Person("001", LocalDate.of(2016, 1, 1))
        };


        //使用匿名内部类
        Arrays.sort(pArrr, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getBirthday().compareTo(o2.getBirthday());
            }
        });


        System.out.println(Arrays.asList(pArrr));
    }

    //改进一。使用Lambda表达式，未调用已存在的方法
    @Test
    public void test1() {
        Person[] people = new Person[]{
                new Person("003", LocalDate.of(2016, 9, 1))
        };

        //使用Lambda表达式
        Arrays.sort(people, (Person a, Person b) -> {
            return a.getBirthday().compareTo(b.getBirthday());
        });

        System.out.println(Arrays.asList(people));
    }


    //改进二，使用方法引用
    @Test
    public void test3() {
        Person[] people = new Person[] {
                new Person("001", LocalDate.of(2016, 9, 1))
        };

        //使用方法引用，引用的是类的静态方法
        Arrays.sort(people, Person::compareByAge);

        System.out.println(Arrays.asList(people));

    }

    //四.四种方法引用类型
    /**
     * 方法引用的标准形式: 类名::方法名(注意: 只需要写方法名，不需要写括号)
     *
     *
     * 类型                                示例
     * 引用静态方法                       ContainingClass::staticMethodName
     * 引用某个对象的实例方法              containingObject::instanceMethodName
     * 引用某个类型的任意对象的实例方法     ContainingType::methodName
     * 引用构造方法                       ClassName::new
     *
     */

    /**
     * 1.静态方法引用
     *  组成语法格式: ClassName::staticMethodName
     *  我们前面举的例子Person::compareByAge就是一个静态方法引用。
     *  注意:
     *      >静态方法引用比较容易理解，和静态方法调用相比，只是把.换位::
     *      >在目标类型兼容的任何地方，都可以使用静态方法引用。
     *  例子:
     *      String::valueOf 等价于Lambda表达式(s) -> String.valueOf(s)
     *      Math::pow  等价于lambda表达式(x, y) ->Math.pow(x,y);
     *
     *
     */


    /**
     * 2.特定实例对象的方法引用
     *  这种语法与用于静态方法的语法类似，只不过这里使用对象引用而不是类名，实例方法引用又分以下三种类型:
     *
     *  a.实例上的实例方法引用
     *  组成语法格式:instanceReference::methodName
     *
     *  b.超类上的实例方法引用
     *      组成语法格式: super::methodName
     *      方法的名称由methodName指定，通过使用super,可以引用方法的超类版本。
     *      例子:
     *      还可以捕获this指针，this::equals
     *
     *
     *  c:类型上的实例方法引用
     *      组成语法格式: ClassName::methodName
     *      注意:
     *          若类型的实例方法是泛型的，就需要在::分隔符前提供类型参数，或者(多数情况下)利用目标类型推导出其类型。
     *          静态方法引用和类型上的实例方法引用拥有唯一样的语法。
     *
     */




}
